#include <iostream>
#include <stdio.h>

/*
 * 全局对象的构造函数与析构函数		P157
 */

class Base
{
	public:
		Base (void);
		void demo(void);
		~Base(void);
};

Base::Base()
{
	printf("Constructor.\n");
}

Base::~Base()
{
	printf("Destructor.\n");
}

void Base::demo(void)
{
	printf("Base.\n");
}


int main()
{
	static Base p;
	
	p.demo();
}

/*
	Constructor.
	Base.
	Destructor.
 */

 #if 0
/*
 * intel
 */
000000000000120a <_ZN4BaseC1Ev>:
    120a:	f3 0f 1e fa          	endbr64 
    120e:	55                   	push   %rbp
    120f:	48 89 e5             	mov    %rsp,%rbp
    1212:	48 83 ec 10          	sub    $0x10,%rsp
    1216:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)
    121a:	48 8d 3d e4 0d 00 00 	lea    0xde4(%rip),%rdi        # 2005 <_ZStL19piecewise_construct+0x1>
    1221:	e8 ca fe ff ff       	callq  10f0 <puts@plt>
    1226:	90                   	nop
    1227:	c9                   	leaveq 
    1228:	c3                   	retq   
    1229:	90                   	nop

000000000000122a <_ZN4BaseD1Ev>:
    122a:	f3 0f 1e fa          	endbr64 
    122e:	55                   	push   %rbp
    122f:	48 89 e5             	mov    %rsp,%rbp
    1232:	48 83 ec 10          	sub    $0x10,%rsp
    1236:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)
    123a:	48 8d 3d d1 0d 00 00 	lea    0xdd1(%rip),%rdi        # 2012 <_ZStL19piecewise_construct+0xe>
    1241:	e8 aa fe ff ff       	callq  10f0 <puts@plt>
    1246:	90                   	nop
    1247:	c9                   	leaveq 
    1248:	c3                   	retq   
    1249:	90                   	nop

000000000000124a <_ZN4Base4demoEv>:
    124a:	f3 0f 1e fa          	endbr64 
    124e:	55                   	push   %rbp
    124f:	48 89 e5             	mov    %rsp,%rbp
    1252:	48 83 ec 10          	sub    $0x10,%rsp
    1256:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)
    125a:	48 8d 3d bd 0d 00 00 	lea    0xdbd(%rip),%rdi        # 201e <_ZStL19piecewise_construct+0x1a>
    1261:	e8 8a fe ff ff       	callq  10f0 <puts@plt>
    1266:	90                   	nop
    1267:	c9                   	leaveq 
    1268:	c3                   	retq   

0000000000001269 <main>:
    1269:	f3 0f 1e fa          	endbr64 
    126d:	55                   	push   %rbp
    126e:	48 89 e5             	mov    %rsp,%rbp
    1271:	41 54                	push   %r12
    1273:	53                   	push   %rbx
    1274:	0f b6 05 ad 2d 00 00 	movzbl 0x2dad(%rip),%eax        # 4028 <_ZGVZ4mainE1p>
    127b:	84 c0                	test   %al,%al			// al & al
    127d:	0f 94 c0             	sete   %al			// D = ZF
    1280:	84 c0                	test   %al,%al			// al & al
    1282:	74 4d                	je     12d1 <main+0x68>
    1284:	48 8d 3d 9d 2d 00 00 	lea    0x2d9d(%rip),%rdi        # 4028 <_ZGVZ4mainE1p>
    128b:	e8 80 fe ff ff       	callq  1110 <__cxa_guard_acquire@plt>
    1290:	85 c0                	test   %eax,%eax
    1292:	0f 95 c0             	setne  %al
    1295:	84 c0                	test   %al,%al
    1297:	74 38                	je     12d1 <main+0x68>
    1299:	41 bc 00 00 00 00    	mov    $0x0,%r12d
    129f:	48 8d 3d 7b 2d 00 00 	lea    0x2d7b(%rip),%rdi        # 4021 <_ZZ4mainE1p>
    12a6:	e8 5f ff ff ff       	callq  120a <_ZN4BaseC1Ev>
    12ab:	48 8d 15 56 2d 00 00 	lea    0x2d56(%rip),%rdx        # 4008 <__dso_handle>
    12b2:	48 8d 35 68 2d 00 00 	lea    0x2d68(%rip),%rsi        # 4021 <_ZZ4mainE1p>
    12b9:	48 8d 3d 6a ff ff ff 	lea    -0x96(%rip),%rdi        # 122a <_ZN4BaseD1Ev>
    12c0:	e8 0b fe ff ff       	callq  10d0 <__cxa_atexit@plt>
    12c5:	48 8d 3d 5c 2d 00 00 	lea    0x2d5c(%rip),%rdi        # 4028 <_ZGVZ4mainE1p>
    12cc:	e8 ef fd ff ff       	callq  10c0 <__cxa_guard_release@plt>
    12d1:	48 8d 3d 49 2d 00 00 	lea    0x2d49(%rip),%rdi        # 4021 <_ZZ4mainE1p>
    12d8:	e8 6d ff ff ff       	callq  124a <_ZN4Base4demoEv>
    12dd:	b8 00 00 00 00       	mov    $0x0,%eax
    12e2:	eb 23                	jmp    1307 <main+0x9e>
    12e4:	f3 0f 1e fa          	endbr64 
    12e8:	48 89 c3             	mov    %rax,%rbx
    12eb:	45 84 e4             	test   %r12b,%r12b
    12ee:	75 0c                	jne    12fc <main+0x93>
    12f0:	48 8d 3d 31 2d 00 00 	lea    0x2d31(%rip),%rdi        # 4028 <_ZGVZ4mainE1p>
    12f7:	e8 b4 fd ff ff       	callq  10b0 <__cxa_guard_abort@plt>
    12fc:	48 89 d8             	mov    %rbx,%rax
    12ff:	48 89 c7             	mov    %rax,%rdi
    1302:	e8 f9 fd ff ff       	callq  1100 <_Unwind_Resume@plt>
    1307:	5b                   	pop    %rbx
    1308:	41 5c                	pop    %r12
    130a:	5d                   	pop    %rbp
    130b:	c3                   	retq   

/*
 * arm
 */
000000000040096c <_ZN4BaseC1Ev>:
  40096c:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  400970:	910003fd 	mov	x29, sp
  400974:	f9000fa0 	str	x0, [x29, #24]
  400978:	90000000 	adrp	x0, 400000 <_init-0x770>
  40097c:	912f6000 	add	x0, x0, #0xbd8
  400980:	97ffffb0 	bl	400840 <puts@plt>
  400984:	d503201f 	nop
  400988:	a8c27bfd 	ldp	x29, x30, [sp], #32
  40098c:	d65f03c0 	ret

0000000000400990 <_ZN4BaseD1Ev>:
  400990:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  400994:	910003fd 	mov	x29, sp
  400998:	f9000fa0 	str	x0, [x29, #24]
  40099c:	90000000 	adrp	x0, 400000 <_init-0x770>
  4009a0:	912fa000 	add	x0, x0, #0xbe8
  4009a4:	97ffffa7 	bl	400840 <puts@plt>
  4009a8:	d503201f 	nop
  4009ac:	a8c27bfd 	ldp	x29, x30, [sp], #32
  4009b0:	d65f03c0 	ret

00000000004009b4 <_ZN4Base4demoEv>:
  4009b4:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  4009b8:	910003fd 	mov	x29, sp
  4009bc:	f9000fa0 	str	x0, [x29, #24]
  4009c0:	90000000 	adrp	x0, 400000 <_init-0x770>
  4009c4:	912fe000 	add	x0, x0, #0xbf8
  4009c8:	97ffff9e 	bl	400840 <puts@plt>
  4009cc:	d503201f 	nop
  4009d0:	a8c27bfd 	ldp	x29, x30, [sp], #32
  4009d4:	d65f03c0 	ret

00000000004009d8 <main>:
  4009d8:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  4009dc:	910003fd 	mov	x29, sp
  4009e0:	a90153f3 	stp	x19, x20, [sp, #16]
  4009e4:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  4009e8:	91024000 	add	x0, x0, #0x90
  4009ec:	08dffc00 	ldarb	w0, [x0]
  4009f0:	12001c00 	and	w0, w0, #0xff
  4009f4:	12000000 	and	w0, w0, #0x1
  4009f8:	7100001f 	cmp	w0, #0x0
  4009fc:	1a9f17e0 	cset	w0, eq  // eq = none	Conditional Set, 相等设置为1，不等设置为0
  400a00:	12001c00 	and	w0, w0, #0xff
  400a04:	7100001f 	cmp	w0, #0x0
  400a08:	540002e0 	b.eq	400a64 <main+0x8c>  // b.none
  400a0c:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400a10:	91024000 	add	x0, x0, #0x90
  400a14:	97ffff6b 	bl	4007c0 <__cxa_guard_acquire@plt>
  400a18:	7100001f 	cmp	w0, #0x0
  400a1c:	1a9f07e0 	cset	w0, ne  // ne = any
  400a20:	12001c00 	and	w0, w0, #0xff
  400a24:	7100001f 	cmp	w0, #0x0
  400a28:	540001e0 	b.eq	400a64 <main+0x8c>  // b.none
  400a2c:	52800013 	mov	w19, #0x0                   	// #0
  400a30:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400a34:	91022000 	add	x0, x0, #0x88
  400a38:	97ffffcd 	bl	40096c <_ZN4BaseC1Ev>
  400a3c:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400a40:	91024000 	add	x0, x0, #0x90
  400a44:	97ffff77 	bl	400820 <__cxa_guard_release@plt>
  400a48:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400a4c:	9101a002 	add	x2, x0, #0x68
  400a50:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400a54:	91022001 	add	x1, x0, #0x88
  400a58:	90000000 	adrp	x0, 400000 <_init-0x770>
  400a5c:	91264000 	add	x0, x0, #0x990
  400a60:	97ffff64 	bl	4007f0 <__cxa_atexit@plt>
  400a64:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400a68:	91022000 	add	x0, x0, #0x88
  400a6c:	97ffffd2 	bl	4009b4 <_ZN4Base4demoEv>
  400a70:	52800000 	mov	w0, #0x0                   	// #0
  400a74:	14000009 	b	400a98 <main+0xc0>
  400a78:	aa0003f4 	mov	x20, x0
  400a7c:	7100027f 	cmp	w19, #0x0
  400a80:	54000081 	b.ne	400a90 <main+0xb8>  // b.any
  400a84:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400a88:	91024000 	add	x0, x0, #0x90
  400a8c:	97ffff69 	bl	400830 <__cxa_guard_abort@plt>
  400a90:	aa1403e0 	mov	x0, x20
  400a94:	97ffff73 	bl	400860 <_Unwind_Resume@plt>
  400a98:	a94153f3 	ldp	x19, x20, [sp, #16]
  400a9c:	a8c27bfd 	ldp	x29, x30, [sp], #32
  400aa0:	d65f03c0 	ret

 #endif
